/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package provaserializzazione;
import java.sql.*;
import java.util.*;
import java.io.*;


/**
 *
 * @author francescoparis
 */
public class DBUtility {
    private static String url;
    private static String port;
    private static String user;
    private static String pass;
    private static String dbname;
    
    private static String driver = "com.mysql.jdbc.Driver";
    private static Connection conn;
    private static ResultSet resulset;
    private static Statement statement;
    private static PreparedStatement preparedStatement;
    
    
    /**
     * Legge il file config.properties
     * che contiene i dati per l'interazione
     * con il db ed inizializza le variabili 
     */
    public static void loadProperties(){
        try{
            Properties p = new Properties();
            p.load(new FileInputStream("config.properties"));
            url = p.getProperty("jdbcUrl");
            port = p.getProperty("jdbcPort");
            user = p.getProperty("jdbcUsername");
            pass = p.getProperty("jdbcPassword");
            dbname = p.getProperty("jdbcDBname");
            //System.out.println(url+port+user+pass+dbname);
        }catch(FileNotFoundException e){
            e.printStackTrace();
        }/*fine catch*/
        catch(IOException e){
            e.printStackTrace();
        }
    }/*fine metodo loadProperties*/
    
    
    /**
     * Carico il Driver del db
     */
    public static void loadDriver(){
        try{
            Class.forName(driver);
        }catch(ClassNotFoundException ex){
            ex.printStackTrace();
        }/*fine catch*/
    }/*fine metodo loadDriver*/
    
    
    /**
     * Effettua la connessione al db
     * il nome della tabella e' paris
     */    
    public static void doConnection(){
        try{
            String completeUrl = "jdbc:mysql://" + url + ":" + port + "/" + dbname;
            conn = DriverManager.getConnection(completeUrl, user, pass);
            //System.out.println("Conessione al db effettuta con successo");            
        }catch(SQLException ex){
            ex.printStackTrace();
        }/*fine catch*/
    }/*fine metodo doConnection*/
    
    
    
    
    
    /**
     * Crea la struttura e popola il db
     */
    public static void popolaDatabase(){
        if(conn != null){
            try{
                
                //creo tabella
                statement = conn.createStatement();                
                String creazione = "CREATE TABLE paris (id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, idutente INTEGER, idvotato INTEGER, valore DOUBLE, PRIMARY KEY(id))";
                int risultato = statement.executeUpdate(creazione);
                if (statement != null) { statement.close(); }
                
                
                //acquisco dati 
                FileReader r1 = new FileReader("datiDB.dat");
                Scanner in1 = new Scanner(r1);
            
                String up = "INSERT INTO paris(idutente, idvotato, valore) VALUES (?,?,?)";
                PreparedStatement pstmt = conn.prepareStatement(up);
                
                while(in1.hasNextLine())
                {   
                    String line = in1.nextLine();
                    StringTokenizer st = new StringTokenizer(line,",");
                    int idutente = Integer.parseInt(st.nextToken());
                    int idvotato = Integer.parseInt(st.nextToken());
                    double val = Double.parseDouble(st.nextToken());
                
                    pstmt.setInt(1, idutente);
                    pstmt.setInt(2, idvotato);
                    pstmt.setDouble(3, val);
                    pstmt.executeUpdate();
                }
                pstmt.close();
                in1.close();
                r1.close();
            }catch(SQLException ex){
                ex.printStackTrace();
            }/*fine catch*/
            catch(IOException exception){
                System.out.println("Errore processamento file" + exception);
            }
        }/*fine if controllo conn*/
        else{
            System.out.println("Nessuna connessione attiva per eseguire una query");            
        }/*fine else*/
    }/*fine metodo popolaDatabase*/
    
    
    
    
    
    
    
    /**
     * Chiude la connessione al db
     */
    public static void closeConnection(){
        try{
            conn.close();
            //System.out.println("Disconessione al db effettuta con successo");            
        }catch(SQLException ex){
            ex.printStackTrace();
        }/*fine catch*/
    }/*fine metodo closeConnection*/
    
    
    
     /**
     *Recupera con una query gli utenti simili all'utente attivo con i relativi valori di similarita'
     *@param id l'utente attivo
     */
     public static ResultSet getUtentiSimili(int id){
        ResultSet rs = null;
        //PreparedStatement preparedStatement = null;
        try {
            statement = conn.createStatement();
            String q = "SELECT * FROM paris WHERE idutente=" + id + " OR idvotato=" + id + " ORDER BY valore DESC LIMIT 300";
            rs = statement.executeQuery(q);
            
            //String q = "SELECT * FROM paris WHERE idutente= ? OR idvotato= ? ORDER BY valore DESC";
            //preparedStatement = conn.prepareStatement(q);
            //preparedStatement.setInt(1, id);
            //preparedStatement.setInt(2, id);
 
	    // execute select SQL stetement
	    //rs = preparedStatement.executeQuery();
            
            
        }catch(SQLException ex){
             ex.printStackTrace();
        }
        return rs;
    }/*fine metodo getUtentiSimili*/
     
     
     
     
     public static ResultSet getMediaDb(int i){
         ResultSet rs = null;
         try {
            statement = conn.createStatement();
            String q = "SELECT * FROM media WHERE idutente=" + i;
            rs = statement.executeQuery(q);
        }catch(SQLException ex){
             ex.printStackTrace();
        }
        return rs;
     }/*fine metodo getMediaDb*/
     
     
     
     
     /**
     * Metodo che conta quanti voti ha ricevuto un utente
     * @param i l'utente di cui si vuole contare i voti dati
     */
    public static ResultSet contaUtente(int i){
        if(conn != null){
            try{
                statement = conn.createStatement();
                String query = "SELECT COUNT(*) FROM dati WHERE idvotato=" + i;
                resulset = statement.executeQuery(query); 
            }catch(SQLException ex){
                ex.printStackTrace();
            }/*fine catch*/
            return resulset;
        }/*fine if controllo conn*/
        else{
            System.out.println("Nessuna connessione attiva per eseguire una query");
            return null;
        }/*fine else*/
        
    }/*fine conta utente*/
    
    
    
    /**
     * Metodo che restituisce la somma dei voti ricevuti un utente
     * @param i l'utente di cui si vuole avere la somma dei voti ricevuti
     */
    public static ResultSet sommaUtente(int i){
        if(conn != null){
            try{
                statement = conn.createStatement();
                String query = "SELECT SUM(valore) FROM dati WHERE idvotato=" + i;
                resulset = statement.executeQuery(query); 
            }catch(SQLException ex){
                ex.printStackTrace();
            }/*fine catch*/
            return resulset;
        }/*fine if controllo conn*/
        else{
            System.out.println("Nessuna connessione attiva per eseguire una query");
            return null;
        }/*fine else*/
        
    }/*fine conta utente*/
    
    
    
}
